freeslot(
	"MT_OCTUS",
	"S_OCTUS",
	"MT_OCTUS_TENTACLE",
	"S_OCTUS_TENTACLE",
	"MT_OCTUS_TENTACLE_LARGE",
	"S_OCTUS_TENTACLE_LARGE",
	"SPR_OCTO",
	"SPR_TNCL"
)

mobjinfo[MT_OCTUS] = {
	//$Sprite OCTOA1
	//$Name Octus
	//$Category Enemies
	doomednum = 1337,
	spawnstate = S_OCTUS,
	spawnhealth = 1,
	deathstate = S_XPLD1,
	deathsound = sfx_pop,
	radius = 24*FRACUNIT,
	height = 48*FRACUNIT,
	flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE|MF_NOGRAVITY
}

states[S_OCTUS] = {
	sprite = SPR_OCTO,
	frame = A,
	tics = -1,
	nextstate = S_OCTUS
}

mobjinfo[MT_OCTUS_TENTACLE] = {
	doomednum = -1,
	spawnstate = S_OCTUS_TENTACLE,
	spawnhealth = 1,
	radius = 8*FRACUNIT,
	height = 8*FRACUNIT,
	dispoffset = -2,
	flags = MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOGRAVITY
}

states[S_OCTUS_TENTACLE] = {
	sprite = SPR_TNCL,
	frame = A,
	tics = -1,
	nextstate = S_OCTUS_TENTACLE
}

mobjinfo[MT_OCTUS_TENTACLE_LARGE] = {
	doomednum = -1,
	spawnstate = S_OCTUS_TENTACLE_LARGE,
	spawnhealth = 1,
	radius = 16*FRACUNIT,
	height = 16*FRACUNIT,
	dispoffset = -1,
	flags = MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOGRAVITY
}

states[S_OCTUS_TENTACLE_LARGE] = {
	sprite = SPR_TNCL,
	frame = B,
	tics = -1,
	nextstate = S_OCTUS_TENTACLE_LARGE
}

local function thrustTowardsZ(mo, target, speed)
	local vdist = target - mo.z
	if mo.z > target
		mo.z = $-(speed*FRACUNIT)
	end
	if mo.z < target
		mo.z = $+(speed*FRACUNIT)
	end
end

local firinginterval = 2*TICRATE
local bulletspeed = 35

addHook("MobjSpawn",
	function(mo)
		mo.tentacles = {}
		mo.tentacleslarge = {}
		
		mo.anglecounter = ANG1
		
		mo.firingcounter = firinginterval
		mo.fired = 0

		mo.risingcounter = 0
		mo.rising = 0
		
		for i=1,8
			mo.tentacles[i] = P_SpawnMobj(
				mo.x+FixedMul(20*FRACUNIT, cos(mo.angle+(ANGLE_45*i))),
				mo.y+FixedMul(20*FRACUNIT, sin(mo.angle+(ANGLE_45*i))),
				mo.z-(3*FRACUNIT),
				MT_OCTUS_TENTACLE
			)
				
			mo.tentacleslarge[i] = P_SpawnMobj(
				mo.x+FixedMul(40*FRACUNIT, cos(mo.angle+(ANGLE_45*i))),
				mo.y+FixedMul(40*FRACUNIT, sin(mo.angle+(ANGLE_45*i))),
				mo.z-(10*FRACUNIT),
				MT_OCTUS_TENTACLE_LARGE
			)
					
			mo.tentacles[i].target = mo
			mo.tentacleslarge[i].target = mo
		end
	end,
MT_OCTUS)

addHook("MobjThinker",
	function(mo)
		mo.anglecounter = $ + (ANG1*5)

		if P_LookForPlayers(mo, 2048*FRACUNIT)
			mo.angle = R_PointToAngle2(mo.x, mo.y, mo.target.x, mo.target.y)

			if mo.rising == 0
			and mo.risingcounter == 0
			and mo.z != mo.target.z
				mo.rising = 1
				S_StartSound(mo, sfx_s3k75)
			end
			
			if mo.rising == 1
				thrustTowardsZ(mo, mo.target.z+(mo.target.height/2), 5)
			end
			
			if mo.target
			and mo.z <= mo.target.z+(16*FRACUNIT)
			and mo.z >= mo.target.z-(16*FRACUNIT)
				mo.risingcounter = 35
				mo.rising = 2
			end
			
			if mo.rising == 2
			and mo.risingcounter > 0
				mo.risingcounter = $-1
				if mo.risingcounter == 0
					mo.rising = 0
				end
			end

			if mo.fired == 0
				mo.firingcounter = $ - 1
			end

			if mo.firingcounter == 0
				mo.projectile = P_SpawnMobj(
					mo.x,
					mo.y,
					mo.z+15*FRACUNIT,
					MT_JETTBULLET
				)

				mo.projectile.target = mo
				mo.projectile.momx = FixedMul(bulletspeed*FRACUNIT, cos(mo.angle))
				mo.projectile.momy = FixedMul(bulletspeed*FRACUNIT, sin(mo.angle))

				mo.fired = 1
				
				S_StartSound(mo, sfx_s3k4d)
			end
		end
		
		if mo.fired == 1
			mo.firingcounter = firinginterval
			mo.fired = 0
		end

		for i=1,8
			if mo.valid
			and mo.tentacles[i].valid
			and mo.tentacleslarge[i].valid
				P_SetOrigin(
					mo.tentacles[i],
					mo.x+FixedMul(20*FRACUNIT, cos(mo.angle+((ANGLE_45*i)+mo.anglecounter))),
					mo.y+FixedMul(20*FRACUNIT, sin(mo.angle+((ANGLE_45*i)+mo.anglecounter))),
					mo.z+FixedMul(3*FRACUNIT, sin(-mo.anglecounter))
				)
				P_SetOrigin(
					mo.tentacleslarge[i],
					mo.x+FixedMul(40*FRACUNIT, cos(mo.angle+((ANGLE_45*i)+mo.anglecounter))),
					mo.y+FixedMul(40*FRACUNIT, sin(mo.angle+((ANGLE_45*i)+mo.anglecounter))),
					mo.z+FixedMul(10*FRACUNIT, sin(-mo.anglecounter))
				)
			end
		end

	end,
MT_OCTUS)

addHook("MobjDeath",
	function(mo)
		for i=1,8
			P_KillMobj(mo.tentacles[i])
			P_KillMobj(mo.tentacleslarge[i])
		end
	end,
MT_OCTUS)